home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
mint
/
mint110s.zoo
/
console.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-02-11
|
5KB
|
310 lines
/*
Copyright 1990,1991,1992 Eric R. Smith.
Copyright 1993,1994 Atari Corporation.
All rights reserved.
*/
/* MiNT routines for doing console I/O */
#include "mint.h"
/*
* These routines are what Cconout, Cauxout, etc. ultimately call.
* They take an integer argument which is the user's file handle,
* and do the translation to a file ptr (and return an appropriate error
* message if necessary.
* "mode" may be RAW, COOKED, ECHO, or COOKED|ECHO.
* note that the user may not call them directly!
*/
long
file_instat(f)
FILEPTR *f;
{
long r;
if (!f) {
return EIHNDL;
}
r = 1; /* default is to assume input waiting (e.g. TOS files)*/
(void)(*f->dev->ioctl)(f, FIONREAD, &r);
return r;
}
long
file_outstat(f)
FILEPTR *f;
{
long r;
if (!f) {
return EIHNDL;
}
r = 1; /* default is to assume output OK (e.g. TOS files) */
(void)(*f->dev->ioctl)(f, FIONWRITE, &r);
return r;
}
long
file_getchar(f, mode)
FILEPTR *f;
int mode;
{
char c;
long r;
if (!f) {
return EIHNDL;
}
if (is_terminal(f)) {
return tty_getchar(f, mode);
}
r = (*f->dev->read)(f, &c, 1L);
if (r != 1)
return MiNTEOF;
else
return ((long)c) & 0xff;
}
long
file_putchar(f, c, mode)
FILEPTR *f;
long c;
int mode;
{
char ch;
if (!f) {
return EIHNDL;
}
if (is_terminal(f)) {
return tty_putchar(f, c & 0x7fffffffL, mode);
}
ch = c & 0x00ff;
return (*f->dev->write)(f, &ch, 1L);
}
/*
* OK, here are the GEMDOS console I/O routines
*/
long ARGS_ON_STACK
c_conin()
{
return file_getchar(curproc->handle[0], COOKED|ECHO);
}
long ARGS_ON_STACK
c_conout(c)
int c;
{
return file_putchar(curproc->handle[1], (long)c, COOKED);
}
long ARGS_ON_STACK
c_auxin()
{
return file_getchar(curproc->handle[2], RAW);
}
long ARGS_ON_STACK
c_auxout(c)
int c;
{
return file_putchar(curproc->handle[2], (long)c, RAW);
}
long ARGS_ON_STACK
c_prnout(c)
int c;
{
return file_putchar(curproc->handle[3], (long)c, RAW);
}
long ARGS_ON_STACK
c_rawio(c)
int c;
{
long r;
PROC *p = curproc;
if (c == 0x00ff) {
if (!file_instat(p->handle[0]))
return 0;
r = file_getchar(p->handle[0], RAW);
if (r <= 0)
return 0;
return r;
}
else
return file_putchar(p->handle[1], (long)c, RAW);
}
long ARGS_ON_STACK
c_rawcin()
{
return file_getchar(curproc->handle[0], RAW);
}
long ARGS_ON_STACK
c_necin()
{
return file_getchar(curproc->handle[0],COOKED|NOECHO);
}
long ARGS_ON_STACK
c_conws(str)
const char *str;
{
const char *p = str;
long cnt = 0;
while (*p++) cnt++;
return f_write(1, cnt, str);
}
long ARGS_ON_STACK
c_conrs(buf)
char *buf;
{
long size, r;
char *s;
size = ((long)*buf) & 0xff;
r = f_read(0, size, buf+2);
if (r < 0) {
buf[1] = 0;
return r;
}
/* if reading from a file, stop at first CR or LF encountered */
s = buf+2;
size = 0;
while(r-- > 0) {
if (*s == '\r' || *s == '\n')
break;
s++; size++;
}
buf[1] = (char)size;
return 0;
}
long ARGS_ON_STACK
c_conis()
{
return -(!!file_instat(curproc->handle[0]));
}
long ARGS_ON_STACK
c_conos()
{
return -(!!file_outstat(curproc->handle[1]));
}
long ARGS_ON_STACK
c_prnos()
{
return -(!!file_outstat(curproc->handle[3]));
}
long ARGS_ON_STACK
c_auxis()
{
return -(!!file_instat(curproc->handle[2]));
}
long ARGS_ON_STACK
c_auxos()
{
return -(!!file_outstat(curproc->handle[2]));
}
/* Extended GEMDOS routines */
long ARGS_ON_STACK
f_instat(h)
int h;
{
PROC *proc;
int fh = h;
#if O_GLOBAL
if (fh >= 100) {
proc = rootproc;
fh -= 100;
} else
#endif
proc = curproc;
if (fh < MIN_HANDLE || fh >=MAX_OPEN) {
DEBUG(("Finstat: bad handle %d", h));
return EIHNDL;
}
return file_instat(proc->handle[fh]);
}
long ARGS_ON_STACK
f_outstat(h)
int h;
{
int fh = h;
PROC *proc;
#if O_GLOBAL
if (fh >= 100) {
fh -= 100;
proc = rootproc;
} else
#endif
proc = curproc;
if (fh < MIN_HANDLE || fh >=MAX_OPEN) {
DEBUG(("Foutstat: bad handle %d", h));
return EIHNDL;
}
return file_outstat(proc->handle[fh]);
}
long ARGS_ON_STACK
f_getchar(h, mode)
int h, mode;
{
int fh = h;
PROC *proc;
#if O_GLOBAL
if (fh >= 100) {
fh -= 100;
proc = rootproc;
} else
#endif
proc = curproc;
if (fh < MIN_HANDLE || fh >=MAX_OPEN) {
DEBUG(("Fgetchar: bad handle %d", h));
return EIHNDL;
}
return file_getchar(proc->handle[fh], mode);
}
long ARGS_ON_STACK
f_putchar(h, c, mode)
int h;
long c;
int mode;
{
int fh = h;
PROC *proc;
#if O_GLOBAL
if (fh >= 100) {
fh -= 100;
proc = rootproc;
} else
#endif
proc = curproc;
if (fh < MIN_HANDLE || fh >=MAX_OPEN) {
DEBUG(("Fputchar: bad handle %d", h));
return EIHNDL;
}
return file_putchar(proc->handle[fh], c, mode);
}